#ifndef DROPPABLEWIDGET_H
#define DROPPABLEWIDGET_H

#include <QWidget>

#include "widgettree.h"
#include "pageswidget.h"

namespace Ui {
class DroppableWidget;
}

/*
    继承了 QWidget GUI类
    整体功能:
        作为整体拖拽框架的基础Widget，用于放置多个pagesWidget，提供拖拽悬浮的创造
    具体功能：
        1、操作pagesWidget的相关函数
        2、焦点窗口变换相关实现
        3、实现拖拽悬浮的创造
*/

class DroppableWidget : public QWidget
{
    Q_OBJECT

public:
    explicit DroppableWidget(QWidget *parent = nullptr);
    ~DroppableWidget();

    void AddPageToFocusPagesWidget(DragableTab *tab, QWidget *widget);
    void AddPageToFocusPagesWidget(QString titleLabel, QWidget *widget, DragableTab::TabType tabType=DragableTab::TabType::DEFAULT);
    // TODO：待进一步优化
    void AddPagesWidget(PagesWidget* pagesWidget);
    PagesWidget* AddPagesWidget(QString tabLabel, QWidget* content, QWidget* parent);
    PagesWidget* AddPagesWidget(DragableTab *tab, QWidget* content, QWidget* parent);
    void RemovePagesWidget(PagesWidget* closePagesWidget);

    std::pair<DragableTab*, QWidget*> FocusPage();
    void RemoveFocusPage();
    PagesWidget* FindPagesById(int id);
    bool IsContainPages(PagesWidget* pagesWidget);
    int Id();
    void SetId(int id);

public slots:
    void FlatPage(int index);
    void FlatPages();

protected:
    void dragEnterEvent(QDragEnterEvent *event) override;
    // void dragMoveEvent(QDragMoveEvent *event) override;
    // void dragLeaveEvent(QDragLeaveEvent *event) override;
    // void dropEvent(QDropEvent *event) override;
    bool PagesDropIn(QPoint dropPos, std::tuple<int, int, int> dragIndex);

signals:
    // 当拖拽的page释放在widget内触发
    // void dropIn(QPoint dropPos, std::tuple<int, int, int> dragIndex);
    // 当焦点page切换时, 我理解要返回一个监听器，去监听page中的container的变化和操作page。
    void FocusPageChanged();
    // 当所有page 全部关闭时，则发出该信号，通知主程序关闭
    void AllPagesClosed();

private:
    static int computeDirection(const QPoint& dropPos, const QPoint& centralPos);
    void ChangeFocusPage(PagesWidget* pagesWidget);

    Ui::DroppableWidget *ui;
    WidgetTree* mRoot {nullptr};
    std::pair<DragableTab*, QWidget*> mFocusPage {nullptr, nullptr};
    PagesWidget* mFocusPagesWidget {nullptr};
    int mMaxPagesId{0};
    int mId{};

private slots:
    void RemovePage();
    void ChangeFocusPagesWidget(const QWidget* content);

    friend class DropManager;
};

#endif // DROPPABLEWIDGET_H
